//package com.github.tvbox.osc.ui.fragment;
//
//import android.os.Bundle;
//import android.os.Message;
//import android.view.LayoutInflater;
//import android.view.View;
//import android.view.ViewGroup;
//import android.widget.ImageView;
//import android.widget.ProgressBar;
//import android.widget.TextView;
//import android.widget.Toast;
//
//import com.github.catvod.utils.Json;
//import com.github.tvbox.osc.R;
//import com.github.tvbox.osc.base.BaseLazyFragment;
//import com.github.tvbox.osc.event.PlayEvent;
//import com.github.tvbox.osc.event.RefreshEvent;
//import com.github.tvbox.osc.player.controller.VodController;
//import com.github.tvbox.osc.viewmodel.SourceViewModel;
//import com.orhanobut.logger.Logger;
//
//import org.greenrobot.eventbus.EventBus;
//import org.greenrobot.eventbus.Subscribe;
//import org.greenrobot.eventbus.ThreadMode;
//import org.json.JSONObject;
//
//import java.util.Map;
//
//import androidx.annotation.NonNull;
//import androidx.annotation.Nullable;
//import androidx.lifecycle.Observer;
//import androidx.lifecycle.ViewModelProvider;
//
//import io.github.source.media.bean.MediaBean;
//import io.github.source.media.bean.MediaPlay;
//import io.github.source.media.bean.MediaResult;
//import xyz.doikki.videoplayer.controller.BaseVideoController;
//import xyz.doikki.videoplayer.player.AbstractPlayer;
//import xyz.doikki.videoplayer.player.VideoView;
//
///**
// * @ClassName: PlayFragment
// * @Description: TODO(这里用一句话描述这个类的作用)播放界面, 播放视频
// * <>再简化，不需要依赖第三方数据类，</>
// * @author: huangrongcai
// * @date: 2024/7/2
// * @Copyright: 黄嵘才（HuangRc)
// */
//public class PlayFragment extends BaseLazyFragment {
//    private static final String TAG = "PlayFragment";
//    public VideoView<AbstractPlayer> mVideoView;
//    /**
//     * 点播控制器（UI）
//     */
//    private VodController mController;
//
//    private SourceViewModel sourceViewModel;
//    private TextView mPlayLoadTip;
//    private ImageView mPlayLoadErr;
//    private ProgressBar mPlayLoading;
//
//    private String url;
//    private Map<String, String> headers;
//    /**
//     * （必要）媒体信息(减少这个在代码的依赖次数）
//     */
//    MediaBean mMediaBean;
//    /**
//     * 点播名称
//     */
//    private String vodName = "";
//    /**
//     * 点播ID
//     */
//    private String vodId = "";
//    /**
//     * 源站点
//     */
//    private String siteKey = "";
//    /**
//     * 点播集的名称
//     */
//    private String mEpisodeName = "";
//
//    private String flag = "";
//
//    private int episodeIndex = 0;
//    private String episodeUrl = "";
//    // Picture-in-Picture support
//    public boolean extPlay;
//
//
//    @Override
//    protected int getLayoutResID() {
//        return R.layout.activity_play;
//    }
//
//    public PlayFragment() {
//        //
//    }
//
//    public static void start() {
//    }
//
//    public void setData() {
//    }
//
//    @Override
//    protected void init() {
//        initView();
//        initViewModel();
//        initData();
//    }
//
//
//    @Override
//    protected void initView() {
//        super.initView();
//
//        mVideoView = findViewById(R.id.mVideoView);
//        mPlayLoadTip = findViewById(R.id.play_load_tip);
//        mPlayLoading = findViewById(R.id.play_loading);
//        mPlayLoadErr = findViewById(R.id.play_load_error);
//
//        setupVodController();
//        setupVideoView();
//    }
//
//    //设置播放器
//    private void setupVideoView() {
//        mVideoView.addOnStateChangeListener(new VideoView.OnStateChangeListener() {
//            @Override
//            public void onPlayerStateChanged(int playerState) {
//                Logger.t(TAG).d("播放器状态 playerState: " + playerState);
//            }
//
//            @Override
//            public void onPlayStateChanged(int playState) {
//                Logger.t(TAG).d("播放状态 playState: " + playState);
//                if (playState == VideoView.STATE_ERROR) {
//                    retryOnPlay();
//                    onPlayError();
//
//                }
//            }
//        });
//    }
//
//    /**
//     * 设置控制器
//     */
//    private void setupVodController() {
//        mController = new VodController(requireContext());
//        //默认配置
//        mController.setCanChangePosition(true);
//        mController.setEnableInNormal(true);
//        mController.setGestureEnabled(true);
//        mController.setPlayerConfig(new JSONObject());
//        setVodController(mController);
//        mController.setVodListener(new VodController.VodControlListener() {
//            @Override
//            public void playNext(boolean rmProgress) {
//                togglePlayNext();
//            }
//
//            @Override
//            public void playPrev() {
//                togglePlayPrev();
//
//            }
//
//            @Override
//            public void updatePlayerCfg() {
//                Toast.makeText(requireContext(), "变更播放器设置", Toast.LENGTH_SHORT).show();
//
//            }
//
//            @Override
//            public void replay() {
//
//            }
//
//            @Override
//            public void errReplay() {
//
//            }
//        });
//
//    }
//
//    /**
//     * 获取当前播放的媒体名称(含有集数）
//     *
//     * @return 媒体名称
//     */
//    public String getName() {
//        return getVodName() + " " + getEpisodeName();
//    }
//
//    /**
//     * 获取当前播放的专辑名称
//     *
//     * @return 专辑名称
//     */
//    public String getEpisodeName() {
//        return mEpisodeName;
//    }
//
//    public void setEpisodeName(String text) {
//        this.mEpisodeName = text;
//    }
//
//    /**
//     * 获取当前播放的媒体名称
//     *
//     * @return 媒体名称
//     */
//
//    public String getVodName() {
//        return vodName;
//    }
//
//    private String getSiteKey() {
//        return siteKey;
//    }
//
//    private String getVodId() {
//        return vodId;
//    }
//
//    private void setVodController(BaseVideoController vodController) {
//        mVideoView.setVideoController(vodController);
//    }
//
//
//    private void initViewModel() {
//        sourceViewModel = new ViewModelProvider(this).get(SourceViewModel.class);
//        sourceViewModel.MediaPlayResult.observeForever(this::setPlayer);
//        //播放的消息
//        sourceViewModel.mMediaCallback.observeForever(new Observer<MediaResult<Message>>() {
//            @Override
//            public void onChanged(MediaResult<Message> msg) {
//                Logger.w("onMessage:" + msg);
//            }
//        });
//    }
//
//    /**
//     * 播放 MediaResult
//     *
//     * @param play play 数据
//     */
//    public void setPlayer(MediaResult<MediaPlay> play) {
//        Logger.t(TAG).d("开始播放 play=" + play);
//        if (play == null || play.getData() == null) {
//            EventBus.getDefault().post(PlayEvent.PLAY_ERROR);
//            return;
//        }
//
//        String playUrl = play.getData().getPlayUrl();
//        if (playUrl == null || playUrl.isEmpty()) {
//            // 如果播放URL为空，可以直接返回或处理异常
//            EventBus.getDefault().post(PlayEvent.PLAY_ERROR);
//            return;
//        }
//        Map<String, String> header;
//        try {
//            // 假设Json.toMap()是一个安全的方法，不会返回null，但可能会抛出异常
//            // 如果你的库中toMap方法返回null是可能的，请在这里添加null检查
//            header = Json.toMap(play.getData().getHeader());
//        } catch (Exception e) {
//            // 处理JSON转换异常，例如记录日志，并返回或进行其他错误处理
//            System.err.println("Error parsing JSON header: " + e.getMessage());
//            return;
//        }
//        // 调用playUrl方法
//        try {
//            startPlay(playUrl, header);
//        } catch (Exception e) {
//            // 处理播放URL调用中可能出现的异常
//            System.err.println("Error playing URL: " + e.getMessage());
//        }
//
//    }
//
//
//    /**
//     * 播放这个视频
//     *
//     * @param bean 数据对象
//     */
//    public void setData(MediaBean bean) {
//        this.mMediaBean = bean;
//        this.mTryBeforeFetchMediaPlay = false;
//        playMedia();
//    }
//
//    private boolean prepareMedia() {
//        return prepareMedia(this.mMediaBean);
//    }
//
//    private boolean prepareMedia(MediaBean bean) {
//        if (bean == null) {
//            return false;
//        }
//        /*准备播放需要的数据*/
//        try {
//            setMediaUrl(bean.getVodEpisodeUrl());
//            setMediaTitle(bean.getVodName());
//            setMediaId(bean.getVodId());
//            setSiteKey(bean.getSiteKey());
//            setEpisodeName(bean.getVodEpisodeName());
//            this.flag = bean.getVodFlagName();
//            this.episodeIndex = bean.getVodEpisodeIndex();
//            return true;
//        } catch (Exception e) {
//            Logger.t(TAG).e("准备播放错误:" + e.getMessage());
//            return false;
//        }
//
//    }
//
//    public void setMediaId(String vodId) {
//        this.vodId = vodId;
//    }
//
//    /**
//     * 设置播放媒体地址
//     *
//     * @param url 地址
//     */
//    public void setMediaUrl(String url) {
//        this.episodeUrl = url;
//    }
//
//    public void setMediaTitle(String text) {
//        this.vodName = text;
//    }
//
//    public void setSiteKey(String siteKey) {
//        this.siteKey = siteKey;
//    }
//
//    private void togglePlayNext() {
//        //通知点播台播放下一个视频
//        EventBus.getDefault().post(PlayEvent.PLAY_NEXT(""));
//
//    }
//
//    private void togglePlayPrev() {
//        // 通知选择下一个视频
//        EventBus.getDefault().post(PlayEvent.PLAY_PREV(""));
//
//    }
//
//    public String getFlag() {
//        return flag;
//    }
//
//
//    /**
//     * 播放视频(默认播放）
//     */
//    private void playMedia() {
//        try {
//            prepareMedia();
//
//            setEpisodeIndex(getFlag(), getEpisodeIndex());
//            setPlayTitle();
//            setTip("正在解析播放地址", true, false);
//            if (shouldTryPlayTheUrl()) {
//                return;
//            }
//            //--获取播放地址
//            String vodSite = getSiteKey();
//            String vodUrl = getEpisodeUrl();
//            String vodFlag = getFlag();
//            String progressKey = prepareProgressKey(getFlag(), getEpisodeIndex());
//
//            fetchMediaPlay(vodSite, vodFlag, progressKey, vodUrl);
//        } catch (Exception e) {
//            Logger.e("播放错误:" + e.getMessage());
//        }
//
//    }
//
//    private void fetchMediaPlay(String siteKey, String playFlag, String progressKey, String playUrl) {
//        if (playUrl == null || playUrl.isEmpty()) {
//            setTip("播放地址为空", true, false);
//            return;
//        }
//        sourceViewModel.fetchPlayer(siteKey, playFlag, progressKey, playUrl);
//    }
//
//    private boolean mTryBeforeFetchMediaPlay = false;
//
//    /**
//     * 是否应该尝试播放视频
//     *
//     * @return true表示应该尝试播放视频，false表示不应该尝试播放视频
//     */
//    private boolean shouldTryPlayTheUrl() {
//        String vodUrl = getEpisodeUrl();
//        if (SourceViewModel.Media.isVideoFormat(vodUrl) && !mTryBeforeFetchMediaPlay) {
//            tryPlayUrl(vodUrl, null);
//            return true;
//        }
//        return false;
//    }
//
//    private void tryPlayUrl(String url, Map<String, String> headers) {
//        mTryBeforeFetchMediaPlay = true;//尝试即时播放
//        startPlay(SourceViewModel.Media.getVideoUrl(url), headers);
//
//    }
//
//    public int getEpisodeIndex() {
//        return episodeIndex;
//    }
//
//    /**
//     * 获取视频播放地址
//     *
//     * @return 视频播放地址
//     */
//    public String getEpisodeUrl() {
//        return episodeUrl;
//    }
//
//    public boolean onBackPressed() {
//        return mController.onBackPressed();
//    }
//
//
//    /**
//     * 设置当前播放的剧集
//     *
//     * @param flag         标签
//     * @param episodeIndex 剧集
//     */
//    public void setEpisodeIndex(String flag, int episodeIndex) {
//        //通知播放
////        List<Flag> flags = mMediaBean.getVodFlags();
////        if (flag == null || flags == null || flags.isEmpty()) {
////            return;
////        }
//
////        flag.setPosition(episodeIndex);
////        for (int i = 0; i < flags.size(); i++) {
////            if (flags.get(i).getFlag().equals(flag.getFlag())) {
////                mMediaBean.setPlayIndex(i);
////                break;
////            }
////        }
//    }
//
//    /**
//     * 设置播放媒体标题
//     */
//    private void setPlayTitle() {
//        String playTitleInfo = getName();
//        setTitle(playTitleInfo);
//    }
//
//    private String prepareProgressKey(String vodFlag, int episodeIndex) {
//        return getSiteKey() + getVodId() + vodFlag + episodeIndex;
//    }
//
//    private void setTitle(String text) {
//        mController.setTitle(text);
//    }
//
//
//    /**
//     * 开始播放
//     *
//     * @param url     媒体的实际播放地址
//     * @param headers 媒体的播放头信息（可以为null)
//     */
//    public void startPlay(String url, Map<String, String> headers) {
//        try {
//            /*
//             *检查，清理，装配，播放
//             */
//            if (!checkMedia(url, headers)) {
//                return;
//            }
//            clearMedia();
//            setupMedia(url, headers);
//            startMedia(url, headers);
//        } catch (Exception e) {
//            Logger.e("播放错误:" + e.getMessage());
//            EventBus.getDefault().post(PlayEvent.PLAY_ERROR);
//        }
//    }
//
//    private boolean checkMedia(String url, Map<String, String> headers) {
//        if (url == null) {
//            EventBus.getDefault().post(PlayEvent.PLAY_ERROR);
//            return false;
//        }
//        return true;
//    }
//
//    private void clearMedia() {
//        //清理
//        hideTip();
//        if (mVideoView != null) {
//            mVideoView.release();
//        }
//    }
//
//    private void setupMedia(String url, Map<String, String> headers) {
//
//        this.url = url;
//        this.headers = headers;
//        Logger.t(TAG).d("Media Source url=" + url + ", headers=" + headers);
//        if (headers != null) {
//            mVideoView.setUrl(url, headers);
//        } else {
//            mVideoView.setUrl(url);
//        }
//    }
//
//    private void startMedia(String url, Map<String, String> headers) {
//        mVideoView.start();
//        mController.resetSpeed();
//    }
//
//    public void onPlayError() {
//        EventBus.getDefault().post(PlayEvent.PLAY_ERROR);
//        //记录出错的播放信息
//        String siteKey = getSiteKey();
//        Logger.t(TAG).e("播放错误:" + "siteKey=" + siteKey);
//        Logger.t(TAG).e("播放错误：url=" + url + ", headers=" + headers);
//
//    }
//
//    private void retryOnPlay() {
//
//        if (mTryBeforeFetchMediaPlay && SourceViewModel.Media.isVideoFormat(getEpisodeUrl())) {
//            playMedia();
//        }
//        mTryBeforeFetchMediaPlay = false;
//    }
//
//    @Subscribe(threadMode = ThreadMode.MAIN)
//    public void refresh(RefreshEvent event) {
//
//    }
//
//    @Subscribe(threadMode = ThreadMode.MAIN)
//    public void onPlayEvent(PlayEvent event) {
//
//    }
//
//    /**
//     * 屏幕提示语
//     *
//     * @param msg     提示语
//     * @param loading
//     * @param err
//     */
//    void setTip(String msg, boolean loading, boolean err) {
//        mPlayLoadTip.setText(msg);
//        mPlayLoadTip.setVisibility(View.VISIBLE);
//        mPlayLoading.setVisibility(loading ? View.VISIBLE : View.GONE);
//        mPlayLoadErr.setVisibility(err ? View.VISIBLE : View.GONE);
//    }
//
//    void hideTip() {
//        mPlayLoadTip.setVisibility(View.GONE);
//        mPlayLoading.setVisibility(View.GONE);
//        mPlayLoadErr.setVisibility(View.GONE);
//    }
//
//    @Nullable
//    @Override
//    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//        EventBus.getDefault().register(this);
//        return super.onCreateView(inflater, container, savedInstanceState);
//    }
//
//    @Override
//    public void onDestroyView() {
//        super.onDestroyView();
//        EventBus.getDefault().unregister(this);
//        release();
//        // 停止磁力下载
//        //停止p2p下载
//    }
//
//    private void release() {
//        if (mVideoView != null) {
//            mVideoView.release();
//            mVideoView = null;
//        }
//    }
//
//    public void hideControl() {
//        mController.hide();
//    }
//
//    private void hideInfo() {
//        //
//    }
//}
